/**
 * 作者：
 * 创建时间：2012-10-23 下午3:28:30
 */
package dragon.model.fieldTemplate;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import dragon.core.db.DML;
import dragon.core.exception.ExceptionHandler;
import dragon.core.util.StringUtils;
import dragon.model.bizObject.BizField;
import dragon.model.bizObject.BizObject;
import dragon.model.bizObject.BizObjectContainer;
import dragon.model.bizObject.QueryField;

/**
 * 实现功能：字段模板操作接口
 */
public class FieldTemplateDao {

	/**
	 * 获取字段模板
	 * 
	 * @param parameterMap
	 *            参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public static final FieldTemplate getFieldTemplate(Map<String, String> parameterMap) throws ExceptionHandler {

		FieldTemplate fieldTemplate = null;

		String bizCode = parameterMap.get("bizCode");
		if (!StringUtils.isEmpty(bizCode)) {
			// 业务模型
			BizObject bizObject = BizObjectContainer.get(bizCode);
			if (bizObject == null) {
				throw new ExceptionHandler("未发现业务模型：" + bizCode);
			}

			String queryfield = parameterMap.get("queryfield");
			String bizfield = parameterMap.get("bizfield");
			if (!StringUtils.isEmpty(queryfield)) {
				// 查询字段模板
				QueryField queryField = bizObject.getQueryFieldByCode(queryfield);
				if (queryField == null) {
					throw new ExceptionHandler(String.format("业务模型 %s[%s]未发现查询字段：%s", bizObject.getName(), bizObject.getCode(), queryfield));
				}
				fieldTemplate = queryField.getFieldTemplate();
				queryField = null;
			} else if (!StringUtils.isEmpty(bizfield)) {
				// 业务字段模板
				BizField bizField = bizObject.getBizFieldByCode(bizfield);
				if (bizField == null) {
					throw new ExceptionHandler(String.format("业务模型 %s[%s]未发现业务字段：%s", bizObject.getName(), bizObject.getCode(), bizfield));
				}
				fieldTemplate = bizField.getFieldTemplate();
				bizField = null;
			}
			bizObject = null;
		} else {
			// 原始字段模板
			String code = parameterMap.get("code");
			fieldTemplate = FieldTemplateContainer.get(code);
		}
		return fieldTemplate;
	}

	/**
	 * 获取字段模板(radio或checkbox)的选项数据
	 * 
	 * @param parameterMap
	 *            参数
	 * @param fieldTemplate
	 *            字段模板
	 * @return
	 * @throws ExceptionHandler
	 */
	@SuppressWarnings("unchecked")
	public static final List<Map<String, Object>> getData(Map<String, String> parameterMap, FieldTemplate fieldTemplate) throws ExceptionHandler {
		List<Map<String, Object>> list = null;
		if (fieldTemplate.getSql() != null && !StringUtils.isEmpty(fieldTemplate.getSql())) {
			// 自定义SQL
			String sql = fieldTemplate.getSql();
			list = DML.query(sql);
			sql = null;
		} else if (fieldTemplate.getDataProvider() != null) {
			// 自定义数据提供者
			list = (List<Map<String, Object>>) fieldTemplate.getDataProvider().getData(parameterMap);
		}
		return list;
	}

	/**
	 * 获取字段模板(radio或checkbox)的选项数据(标签中访问)
	 * 
	 * @param bizCode
	 *            业务模型编码
	 * @param bizfield
	 *            业务字段编码
	 * @param queryfield
	 *            查询字段编码
	 * @param queryString
	 *            其它参数
	 * @return
	 * @throws ExceptionHandler
	 */
	public static final List<Map<String, Object>> getData(String bizCode, String bizfield, String queryfield, String queryString) throws ExceptionHandler {
		Map<String, String> parameterMap = new HashMap<String, String>();
		parameterMap.put("bizCode", bizCode);
		parameterMap.put("bizfield", bizfield);
		parameterMap.put("queryfield", queryfield);
		if (!StringUtils.isEmpty(queryString)) {
			String[] params = queryString.split("&");
			String[] k_v = null;
			for (String param : params) {
				k_v = param.split("=");
				if (k_v != null && k_v.length == 2) {
					parameterMap.put(k_v[0], k_v[1]);
				}
			}
		}

		FieldTemplate fieldTemplate = FieldTemplateDao.getFieldTemplate(parameterMap);
		if (fieldTemplate == null) {
			parameterMap = null;
			throw new ExceptionHandler("未发现字段模板：" + parameterMap);
		}
		return getData(parameterMap, fieldTemplate);
	}

}
